package pnu.ssm.area;

public class MonteCarlo {
	// 확률을 얻어 정적분을 구해내는 알고리즘 
	
	public static void main(String[] args) {
		double area = integral(1000, 2, 5, 0, 10);
		System.out.println(area);
	}
	
	public static float integral(int num_iter, int from_x, int to_x, int min_y, int max_y){
		int num_below = 0;
		int num_above = 0;
		
		for (int i=0; i<num_iter; i++){
			double rand_x = from_x + Math.random() * (to_x - from_x);
			double rand_y = Math.random() * max_y;
			// 무작위로 함수 범위 내의 x, y를 뽑아낸다.
			
			double func_y = function(rand_x);
			// 실제 함수의 값을 구한다.
			
			if(rand_y <= func_y) num_below++; // 적분 범위 내의 수를 카운트한다.
			else num_above++;
		}
		
		float prob = ((float) num_below) / num_iter; // 범위 내의 확률을 구한다.
		float area = (to_x - from_x) * (max_y - min_y) * prob; // 적분값 도출.
		return area;
	}
	
	public static double function(double x_val){
		// 적분할 함수를 f(x) = x^2 이라고 가정한다.
		return x_val*x_val;
	}
}
